package innerclass;

public class AnonymousInnerClass {
    public static void main(String[] args) {
        Outer04 outer04 = new Outer04();
        outer04.method();
    }
}

interface IA {
    public void cry();
}

class Father {
    public Father(String name) {
    }

    public void test() {
    }
}

abstract class Animal {
    abstract void eat();
}

class Outer04 {//外部类
    private int n1 = 10;

    public void method() {
        /**
         * 基于接口的匿名内部类
         * 1.需求：想使用IA接口，并创建对象，Tiger/Dog类只使用一次，后面不再使用
         * 2.传统方式，写一个类实现该接口，并创建对象
         * 解决方案：
         * 3.使用匿名内部类来简化开发
         * 4，tiger的编译类型是？IA
         * 5，tiger的运行类型是？匿名内部类
         * class Outer04$1 implements IA{
         *       @override
         *       public void cry() {
         *           System.out.println("老虎叫")
         *       }
         * }
         * 6.jdk底层在创建匿名内部类 Outer04,并立刻进行实例化，将地址返回给tiger
         * 7.匿名内部类使用一次就不能再次使用
         */
        IA tiger = new IA() {
            @Override
            public void cry() {
                System.out.println("老虎叫");
            }
        };//注意这里需要分号
        tiger.cry();


        //=======================================================
        //演示基于类的匿名内部类
        //1.father的编译类型 Father
        //2.father的运行类型 Outer04$2[有大括号和没有大括号的区别]
        Father father = new Father("jack") {

            @Override
            public void test() {
                System.out.println("匿名内部类重写了test()");
            }
        };
        father.test();
        System.out.println("father的运行类型=" + father.getClass());

        //=====================================================
        //基于抽象类的匿名内部类
        Animal animal = new Animal() {
            @Override
            void eat() {
                System.out.println("吃饭");
            }
        };
        animal.eat();
    }

}